@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,53 +0,0 @@
1
- import {
2
- ProjectConfig,
3
- getCurrentProjectConfig as getCurrentProjectConfigDefault,
4
- saveCurrentProjectConfig as saveCurrentProjectConfigDefault,
5
- } from '../utils/config.js'
6
-
7
- export type ProjectConfigHandler = {
8
- getCurrentProjectConfig: () => ProjectConfig
9
- saveCurrentProjectConfig: (config: ProjectConfig) => void
10
- }
11
-
12
- // Default config handler using the real implementation
13
- const defaultConfigHandler: ProjectConfigHandler = {
14
- getCurrentProjectConfig: getCurrentProjectConfigDefault,
15
- saveCurrentProjectConfig: saveCurrentProjectConfigDefault,
16
- }
17
-
18
- /**
19
- * Handler for the 'approved-tools list' command
20
- */
21
- export function handleListApprovedTools(
22
- cwd: string,
23
- projectConfigHandler: ProjectConfigHandler = defaultConfigHandler,
24
- ): string {
25
- const projectConfig = projectConfigHandler.getCurrentProjectConfig()
26
- return `Allowed tools for ${cwd}:\n${projectConfig.allowedTools.join('\n')}`
27
- }
28
-
29
- /**
30
- * Handler for the 'approved-tools remove' command
31
- */
32
- export function handleRemoveApprovedTool(
33
- tool: string,
34
- projectConfigHandler: ProjectConfigHandler = defaultConfigHandler,
35
- ): { success: boolean; message: string } {
36
- const projectConfig = projectConfigHandler.getCurrentProjectConfig()
37
- const originalToolCount = projectConfig.allowedTools.length
38
- const updatedAllowedTools = projectConfig.allowedTools.filter(t => t !== tool)
39
-
40
- if (originalToolCount !== updatedAllowedTools.length) {
41
- projectConfig.allowedTools = updatedAllowedTools
42
- projectConfigHandler.saveCurrentProjectConfig(projectConfig)
43
- return {
44
- success: true,
45
- message: `Removed ${tool} from the list of approved tools`,
46
- }
47
- } else {
48
- return {
49
- success: false,
50
- message: `${tool} was not in the list of approved tools`,
51
- }
52
- }
53
- }
@@ -1,20 +0,0 @@
1
- import { Command } from '../commands'
2
- import { Bug } from '../components/Bug'
3
- import * as React from 'react'
4
- import { PRODUCT_NAME } from '../constants/product'
5
-
6
- const bug = {
7
- type: 'local-jsx',
8
- name: 'bug',
9
- description: `Submit feedback about ${PRODUCT_NAME}`,
10
- isEnabled: true,
11
- isHidden: false,
12
- async call(onDone) {
13
- return <Bug onDone={onDone} />
14
- },
15
- userFacingName() {
16
- return 'bug'
17
- },
18
- } satisfies Command
19
-
20
- export default bug
@@ -1,43 +0,0 @@
1
- import { Command } from '../commands'
2
- import { getMessagesSetter } from '../messages'
3
- import { getContext } from '../context'
4
- import { getCodeStyle } from '../utils/style'
5
- import { clearTerminal } from '../utils/terminal'
6
- import { getOriginalCwd, setCwd } from '../utils/state'
7
- import { Message } from '../query'
8
- import { resetReminderSession } from '../services/systemReminder'
9
- import { resetFileFreshnessSession } from '../services/fileFreshness'
10
-
11
- export async function clearConversation(context: {
12
- setForkConvoWithMessagesOnTheNextRender: (
13
- forkConvoWithMessages: Message[],
14
- ) => void
15
- }) {
16
- await clearTerminal()
17
- getMessagesSetter()([])
18
- context.setForkConvoWithMessagesOnTheNextRender([])
19
- getContext.cache.clear?.()
20
- getCodeStyle.cache.clear?.()
21
- await setCwd(getOriginalCwd())
22
-
23
- // Reset reminder and file freshness sessions to clean up state
24
- resetReminderSession()
25
- resetFileFreshnessSession()
26
- }
27
-
28
- const clear = {
29
- type: 'local',
30
- name: 'clear',
31
- description: 'Clear conversation history and free up context',
32
- isEnabled: true,
33
- isHidden: false,
34
- async call(_, context) {
35
- clearConversation(context)
36
- return ''
37
- },
38
- userFacingName() {
39
- return 'clear'
40
- },
41
- } satisfies Command
42
-
43
- export default clear
@@ -1,120 +0,0 @@
1
- import { Command } from '../commands'
2
- import { getContext } from '../context'
3
- import { getMessagesGetter, getMessagesSetter } from '../messages'
4
- import { API_ERROR_MESSAGE_PREFIX, queryLLM } from '../services/claude'
5
- import {
6
- createUserMessage,
7
- normalizeMessagesForAPI,
8
- } from '../utils/messages.js'
9
- import { getCodeStyle } from '../utils/style'
10
- import { clearTerminal } from '../utils/terminal'
11
- import { resetReminderSession } from '../services/systemReminder'
12
- import { resetFileFreshnessSession } from '../services/fileFreshness'
13
-
14
- const COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:
15
-
16
- ## Technical Context
17
- Development environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.
18
-
19
- ## Project Overview
20
- Main project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.
21
-
22
- ## Code Changes
23
- Files created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.
24
-
25
- ## Debugging & Issues
26
- Problems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.
27
-
28
- ## Current Status
29
- What we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.
30
-
31
- ## Pending Tasks
32
- Immediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.
33
-
34
- ## User Preferences
35
- Coding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.
36
-
37
- ## Key Decisions
38
- Important technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.
39
-
40
- Focus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`
41
-
42
- const compact = {
43
- type: 'local',
44
- name: 'compact',
45
- description: 'Clear conversation history but keep a summary in context',
46
- isEnabled: true,
47
- isHidden: false,
48
- async call(
49
- _,
50
- {
51
- options: { tools },
52
- abortController,
53
- setForkConvoWithMessagesOnTheNextRender,
54
- },
55
- ) {
56
- const messages = getMessagesGetter()()
57
-
58
- const summaryRequest = createUserMessage(COMPRESSION_PROMPT)
59
-
60
- const summaryResponse = await queryLLM(
61
- normalizeMessagesForAPI([...messages, summaryRequest]),
62
- [
63
- 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',
64
- ],
65
- 0,
66
- tools,
67
- abortController.signal,
68
- {
69
- safeMode: false,
70
- model: 'main', // 使用模型指针,让queryLLM统一解析
71
- prependCLISysprompt: true,
72
- },
73
- )
74
-
75
- const content = summaryResponse.message.content
76
- const summary =
77
- typeof content === 'string'
78
- ? content
79
- : content.length > 0 && content[0]?.type === 'text'
80
- ? content[0].text
81
- : null
82
-
83
- if (!summary) {
84
- throw new Error(
85
- `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,
86
- )
87
- } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {
88
- throw new Error(summary)
89
- }
90
-
91
- summaryResponse.message.usage = {
92
- input_tokens: 0,
93
- output_tokens: summaryResponse.message.usage.output_tokens,
94
- cache_creation_input_tokens: 0,
95
- cache_read_input_tokens: 0,
96
- }
97
-
98
- await clearTerminal()
99
- getMessagesSetter()([])
100
- setForkConvoWithMessagesOnTheNextRender([
101
- createUserMessage(
102
- `Context has been compressed using structured 8-section algorithm. All essential information has been preserved for seamless continuation.`,
103
- ),
104
- summaryResponse,
105
- ])
106
- getContext.cache.clear?.()
107
- getCodeStyle.cache.clear?.()
108
- resetFileFreshnessSession()
109
-
110
- // Reset reminder and file freshness sessions to clean up state
111
- resetReminderSession()
112
-
113
- return '' // not used, just for typesafety. TODO: avoid this hack
114
- },
115
- userFacingName() {
116
- return 'compact'
117
- },
118
- } satisfies Command
119
-
120
- export default compact
@@ -1,19 +0,0 @@
1
- import { Command } from '../commands'
2
- import { Config } from '../components/Config'
3
- import * as React from 'react'
4
-
5
- const config = {
6
- type: 'local-jsx',
7
- name: 'config',
8
- description: 'Open config panel',
9
- isEnabled: true,
10
- isHidden: false,
11
- async call(onDone) {
12
- return <Config onClose={onDone} />
13
- },
14
- userFacingName() {
15
- return 'config'
16
- },
17
- } satisfies Command
18
-
19
- export default config
@@ -1,18 +0,0 @@
1
- import type { Command } from '../commands'
2
- import { formatTotalCost } from '../cost-tracker'
3
-
4
- const cost = {
5
- type: 'local',
6
- name: 'cost',
7
- description: 'Show the total cost and duration of the current session',
8
- isEnabled: true,
9
- isHidden: false,
10
- async call() {
11
- return formatTotalCost()
12
- },
13
- userFacingName() {
14
- return 'cost'
15
- },
16
- } satisfies Command
17
-
18
- export default cost
@@ -1,209 +0,0 @@
1
- import type { Command } from '../commands'
2
- import type { Tool } from '../Tool'
3
- import Table from 'cli-table3'
4
- import { getSystemPrompt } from '../constants/prompts'
5
- import { getContext } from '../context'
6
- import { zodToJsonSchema } from 'zod-to-json-schema'
7
- import { getMessagesGetter } from '../messages'
8
- import { PROJECT_FILE } from '../constants/product'
9
- // Quick and dirty estimate of bytes per token for rough token counts
10
- const BYTES_PER_TOKEN = 4
11
-
12
- interface Section {
13
- title: string
14
- content: string
15
- }
16
-
17
- interface ToolSummary {
18
- name: string
19
- description: string
20
- }
21
-
22
- function getContextSections(text: string): Section[] {
23
- const sections: Section[] = []
24
-
25
- // Find first <context> tag
26
- const firstContextIndex = text.indexOf('<context')
27
-
28
- // Everything before first tag is Core Sysprompt
29
- if (firstContextIndex > 0) {
30
- const coreSysprompt = text.slice(0, firstContextIndex).trim()
31
- if (coreSysprompt) {
32
- sections.push({
33
- title: 'Core Sysprompt',
34
- content: coreSysprompt,
35
- })
36
- }
37
- }
38
-
39
- let currentPos = firstContextIndex
40
- let nonContextContent = ''
41
-
42
- const regex = /<context\s+name="([^"]*)">([\s\S]*?)<\/context>/g
43
- let match: RegExpExecArray | null
44
-
45
- while ((match = regex.exec(text)) !== null) {
46
- // Collect text between context tags
47
- if (match.index > currentPos) {
48
- nonContextContent += text.slice(currentPos, match.index)
49
- }
50
-
51
- const [, name = 'Unnamed Section', content = ''] = match
52
- sections.push({
53
- title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,
54
- content: content.trim(),
55
- })
56
-
57
- currentPos = match.index + match[0].length
58
- }
59
-
60
- // Collect remaining text after last tag
61
- if (currentPos < text.length) {
62
- nonContextContent += text.slice(currentPos)
63
- }
64
-
65
- // Add non-contextualized content if present
66
- const trimmedNonContext = nonContextContent.trim()
67
- if (trimmedNonContext) {
68
- sections.push({
69
- title: 'Non-contextualized Content',
70
- content: trimmedNonContext,
71
- })
72
- }
73
-
74
- return sections
75
- }
76
-
77
- function formatTokenCount(bytes: number): string {
78
- const tokens = bytes / BYTES_PER_TOKEN
79
- const k = tokens / 1000
80
- return `${Math.round(k * 10) / 10}k`
81
- }
82
-
83
- function formatByteCount(bytes: number): string {
84
- const kb = bytes / 1024
85
- return `${Math.round(kb * 10) / 10}kb`
86
- }
87
-
88
- function createSummaryTable(
89
- systemText: string,
90
- systemSections: Section[],
91
- tools: ToolSummary[],
92
- messages: unknown,
93
- ): string {
94
- const table = new Table({
95
- head: ['Component', 'Tokens', 'Size', '% Used'],
96
- style: { head: ['bold'] },
97
- chars: {
98
- mid: '─',
99
- 'left-mid': '├',
100
- 'mid-mid': '┼',
101
- 'right-mid': '┤',
102
- },
103
- })
104
-
105
- const messagesStr = JSON.stringify(messages)
106
- const toolsStr = JSON.stringify(tools)
107
-
108
- // Calculate total for percentages
109
- const total = systemText.length + toolsStr.length + messagesStr.length
110
- const getPercentage = (n: number) => `${Math.round((n / total) * 100)}%`
111
-
112
- // System prompt and its sections
113
- table.push([
114
- 'System prompt',
115
- formatTokenCount(systemText.length),
116
- formatByteCount(systemText.length),
117
- getPercentage(systemText.length),
118
- ])
119
- for (const section of systemSections) {
120
- table.push([
121
- ` ${section.title}`,
122
- formatTokenCount(section.content.length),
123
- formatByteCount(section.content.length),
124
- getPercentage(section.content.length),
125
- ])
126
- }
127
-
128
- // Tools
129
- table.push([
130
- 'Tool definitions',
131
- formatTokenCount(toolsStr.length),
132
- formatByteCount(toolsStr.length),
133
- getPercentage(toolsStr.length),
134
- ])
135
- for (const tool of tools) {
136
- table.push([
137
- ` ${tool.name}`,
138
- formatTokenCount(tool.description.length),
139
- formatByteCount(tool.description.length),
140
- getPercentage(tool.description.length),
141
- ])
142
- }
143
-
144
- // Messages and total
145
- table.push(
146
- [
147
- 'Messages',
148
- formatTokenCount(messagesStr.length),
149
- formatByteCount(messagesStr.length),
150
- getPercentage(messagesStr.length),
151
- ],
152
- ['Total', formatTokenCount(total), formatByteCount(total), '100%'],
153
- )
154
-
155
- return table.toString()
156
- }
157
-
158
- const command: Command = {
159
- name: 'ctx-viz',
160
- description:
161
- 'Show token usage breakdown for the current conversation context',
162
- isEnabled: true,
163
- isHidden: false,
164
- type: 'local',
165
-
166
- userFacingName() {
167
- return this.name
168
- },
169
-
170
- async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {
171
- // Get tools and system prompt with injected context
172
- const [systemPromptRaw, sysContext] = await Promise.all([
173
- getSystemPrompt(),
174
- getContext(),
175
- ])
176
-
177
- const rawTools = cmdContext.options.tools
178
-
179
- // Full system prompt with context sections injected
180
- let systemPrompt = systemPromptRaw.join('\n')
181
- for (const [name, content] of Object.entries(sysContext)) {
182
- systemPrompt += `\n<context name="${name}">${content}</context>`
183
- }
184
-
185
- // Get full tool definitions including prompts and schemas
186
- const tools = rawTools.map(t => {
187
- // Get full prompt and schema
188
- const fullPrompt = t.prompt({ safeMode: false })
189
- const schema = JSON.stringify(
190
- 'inputJSONSchema' in t && t.inputJSONSchema
191
- ? t.inputJSONSchema
192
- : zodToJsonSchema(t.inputSchema),
193
- )
194
-
195
- return {
196
- name: t.name,
197
- description: `${fullPrompt}\n\nSchema:\n${schema}`,
198
- }
199
- })
200
-
201
- // Get current messages from REPL
202
- const messages = getMessagesGetter()()
203
-
204
- const sections = getContextSections(systemPrompt)
205
- return createSummaryTable(systemPrompt, sections, tools, messages)
206
- },
207
- }
208
-
209
- export default command
@@ -1,24 +0,0 @@
1
- import React from 'react'
2
- import type { Command } from '../commands'
3
- import { Doctor } from '../screens/Doctor'
4
- import { PRODUCT_NAME } from '../constants/product'
5
-
6
- const doctor: Command = {
7
- name: 'doctor',
8
- description: `Checks the health of your ${PRODUCT_NAME} installation`,
9
- isEnabled: true,
10
- isHidden: false,
11
- userFacingName() {
12
- return 'doctor'
13
- },
14
- type: 'local-jsx',
15
- call(onDone) {
16
- const element = React.createElement(Doctor, {
17
- onDone,
18
- doctorMode: true,
19
- })
20
- return Promise.resolve(element)
21
- },
22
- }
23
-
24
- export default doctor
@@ -1,19 +0,0 @@
1
- import { Command } from '../commands'
2
- import { Help } from '../components/Help'
3
- import * as React from 'react'
4
-
5
- const help = {
6
- type: 'local-jsx',
7
- name: 'help',
8
- description: 'Show help and available commands',
9
- isEnabled: true,
10
- isHidden: false,
11
- async call(onDone, context) {
12
- return <Help commands={context.options?.commands || []} onClose={onDone} />
13
- },
14
- userFacingName() {
15
- return 'help'
16
- },
17
- } satisfies Command
18
-
19
- export default help
@@ -1,37 +0,0 @@
1
- import type { Command } from '../commands'
2
- import { markProjectOnboardingComplete } from '../ProjectOnboarding'
3
- import { PROJECT_FILE } from '../constants/product'
4
- const command = {
5
- type: 'prompt',
6
- name: 'init',
7
- description: `Initialize a new ${PROJECT_FILE} file with codebase documentation`,
8
- isEnabled: true,
9
- isHidden: false,
10
- progressMessage: 'analyzing your codebase',
11
- userFacingName() {
12
- return 'init'
13
- },
14
- async getPromptForCommand(_args: string) {
15
- // Mark onboarding as complete when init command is run
16
- markProjectOnboardingComplete()
17
- return [
18
- {
19
- role: 'user',
20
- content: [
21
- {
22
- type: 'text',
23
- text: `Please analyze this codebase and create a ${PROJECT_FILE} file containing:
24
- 1. Build/lint/test commands - especially for running a single test
25
- 2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.
26
-
27
- The file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.
28
- If there's already a ${PROJECT_FILE}, improve it.
29
- If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`,
30
- },
31
- ],
32
- },
33
- ]
34
- },
35
- } satisfies Command
36
-
37
- export default command
@@ -1,42 +0,0 @@
1
- import { Command } from '../commands'
2
- import { logError } from '../utils/log'
3
- import { execFileNoThrow } from '../utils/execFileNoThrow'
4
-
5
- const isEnabled =
6
- process.platform === 'darwin' &&
7
- ['iTerm.app', 'Apple_Terminal'].includes(process.env.TERM_PROGRAM || '')
8
-
9
- const listen: Command = {
10
- type: 'local',
11
- name: 'listen',
12
- description: 'Activates speech recognition and transcribes speech to text',
13
- isEnabled: isEnabled,
14
- isHidden: isEnabled,
15
- userFacingName() {
16
- return 'listen'
17
- },
18
- async call(_, { abortController }) {
19
- // Start dictation using AppleScript
20
- const script = `tell application "System Events" to tell ¬
21
- (the first process whose frontmost is true) to tell ¬
22
- menu bar 1 to tell ¬
23
- menu bar item "Edit" to tell ¬
24
- menu "Edit" to tell ¬
25
- menu item "Start Dictation" to ¬
26
- if exists then click it`
27
-
28
- const { stderr, code } = await execFileNoThrow(
29
- 'osascript',
30
- ['-e', script],
31
- abortController.signal,
32
- )
33
-
34
- if (code !== 0) {
35
- logError(`Failed to start dictation: ${stderr}`)
36
- return 'Failed to start dictation'
37
- }
38
- return 'Dictation started. Press esc to stop.'
39
- },
40
- }
41
-
42
- export default listen
@@ -1,51 +0,0 @@
1
- import * as React from 'react'
2
- import type { Command } from '../commands'
3
- import { ConsoleOAuthFlow } from '../components/ConsoleOAuthFlow'
4
- import { clearTerminal } from '../utils/terminal'
5
- import { isLoggedInToAnthropic } from '../utils/auth'
6
- import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
7
- import { Box, Text } from 'ink'
8
- import { clearConversation } from './clear'
9
-
10
- export default () =>
11
- ({
12
- type: 'local-jsx',
13
- name: 'login',
14
- description: isLoggedInToAnthropic()
15
- ? 'Switch Anthropic accounts'
16
- : 'Sign in with your Anthropic account',
17
- isEnabled: true,
18
- isHidden: false,
19
- async call(onDone, context) {
20
- await clearTerminal()
21
- return (
22
- <Login
23
- onDone={async () => {
24
- clearConversation(context)
25
- onDone()
26
- }}
27
- />
28
- )
29
- },
30
- userFacingName() {
31
- return 'login'
32
- },
33
- }) satisfies Command
34
-
35
- function Login(props: { onDone: () => void }) {
36
- const exitState = useExitOnCtrlCD(props.onDone)
37
- return (
38
- <Box flexDirection="column">
39
- <ConsoleOAuthFlow onDone={props.onDone} />
40
- <Box marginLeft={3}>
41
- <Text dimColor>
42
- {exitState.pending ? (
43
- <>Press {exitState.keyName} again to exit</>
44
- ) : (
45
- ''
46
- )}
47
- </Text>
48
- </Box>
49
- </Box>
50
- )
51
- }