@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,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
- }