@shareai-lab/kode 1.1.13 → 1.1.16-dev.1

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 +59 -38
  2. package/dist/entrypoints/cli.js.map +3 -3
  3. package/dist/index.js +5 -26
  4. package/dist/package.json +4 -1
  5. package/package.json +11 -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,243 +0,0 @@
1
- import { statSync } from 'fs'
2
- import { EOL } from 'os'
3
- import { isAbsolute, relative, resolve } from 'path'
4
- import * as React from 'react'
5
- import { z } from 'zod'
6
- import { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'
7
- import { PRODUCT_NAME } from '../../constants/product'
8
- import { queryQuick } from '../../services/claude'
9
- import { Tool, ValidationResult } from '../../Tool'
10
- import { splitCommand } from '../../utils/commands'
11
- import { isInDirectory } from '../../utils/file'
12
- import { logError } from '../../utils/log'
13
- import { PersistentShell } from '../../utils/PersistentShell'
14
- import { getCwd, getOriginalCwd } from '../../utils/state'
15
- import { getGlobalConfig } from '../../utils/config'
16
- import { getModelManager } from '../../utils/model'
17
- import BashToolResultMessage from './BashToolResultMessage'
18
- import { BANNED_COMMANDS, PROMPT } from './prompt'
19
- import { formatOutput, getCommandFilePaths } from './utils'
20
- import { logEvent } from '../../services/statsig'
21
-
22
- export const inputSchema = z.strictObject({
23
- command: z.string().describe('The command to execute'),
24
- timeout: z
25
- .number()
26
- .optional()
27
- .describe('Optional timeout in milliseconds (max 600000)'),
28
- })
29
-
30
- type In = typeof inputSchema
31
- export type Out = {
32
- stdout: string
33
- stdoutLines: number // Total number of lines in original stdout, even if `stdout` is now truncated
34
- stderr: string
35
- stderrLines: number // Total number of lines in original stderr, even if `stderr` is now truncated
36
- interrupted: boolean
37
- }
38
-
39
- export const BashTool = {
40
- name: 'Bash',
41
- async description() {
42
- return 'Executes shell commands on your computer'
43
- },
44
- async prompt() {
45
- const config = getGlobalConfig()
46
- // 🔧 Fix: Use ModelManager to get actual current model
47
- const modelManager = getModelManager()
48
- const modelName =
49
- modelManager.getModelName('main') || '<No Model Configured>'
50
- // Substitute the placeholder in the static PROMPT string
51
- return PROMPT.replace(/{MODEL_NAME}/g, modelName)
52
- },
53
- isReadOnly() {
54
- return false
55
- },
56
- isConcurrencySafe() {
57
- return false // BashTool modifies state/files, not safe for concurrent execution
58
- },
59
- inputSchema,
60
- userFacingName() {
61
- return 'Bash'
62
- },
63
- async isEnabled() {
64
- return true
65
- },
66
- needsPermissions(): boolean {
67
- // Always check per-project permissions for BashTool
68
- return true
69
- },
70
- async validateInput({ command }): Promise<ValidationResult> {
71
- const commands = splitCommand(command)
72
- for (const cmd of commands) {
73
- const parts = cmd.split(' ')
74
- const baseCmd = parts[0]
75
-
76
- // Check if command is banned
77
- if (baseCmd && BANNED_COMMANDS.includes(baseCmd.toLowerCase())) {
78
- return {
79
- result: false,
80
- message: `Command '${baseCmd}' is not allowed for security reasons`,
81
- }
82
- }
83
-
84
- // Special handling for cd command
85
- if (baseCmd === 'cd' && parts[1]) {
86
- const targetDir = parts[1]!.replace(/^['"]|['"]$/g, '') // Remove quotes if present
87
- const fullTargetDir = isAbsolute(targetDir)
88
- ? targetDir
89
- : resolve(getCwd(), targetDir)
90
- if (
91
- !isInDirectory(
92
- relative(getOriginalCwd(), fullTargetDir),
93
- relative(getCwd(), getOriginalCwd()),
94
- )
95
- ) {
96
- return {
97
- result: false,
98
- message: `ERROR: cd to '${fullTargetDir}' was blocked. For security, ${PRODUCT_NAME} may only change directories to child directories of the original working directory (${getOriginalCwd()}) for this session.`,
99
- }
100
- }
101
- }
102
- }
103
-
104
- return { result: true }
105
- },
106
- renderToolUseMessage({ command }) {
107
- // Clean up any command that uses the quoted HEREDOC pattern
108
- if (command.includes("\"$(cat <<'EOF'")) {
109
- const match = command.match(
110
- /^(.*?)"?\$\(cat <<'EOF'\n([\s\S]*?)\n\s*EOF\n\s*\)"(.*)$/,
111
- )
112
- if (match && match[1] && match[2]) {
113
- const prefix = match[1]
114
- const content = match[2]
115
- const suffix = match[3] || ''
116
- return `${prefix.trim()} "${content.trim()}"${suffix.trim()}`
117
- }
118
- }
119
- return command
120
- },
121
- renderToolUseRejectedMessage() {
122
- return <FallbackToolUseRejectedMessage />
123
- },
124
-
125
- renderToolResultMessage(content) {
126
- return <BashToolResultMessage content={content} verbose={false} />
127
- },
128
- renderResultForAssistant({ interrupted, stdout, stderr }) {
129
- let errorMessage = stderr.trim()
130
- if (interrupted) {
131
- if (stderr) errorMessage += EOL
132
- errorMessage += '<error>Command was aborted before completion</error>'
133
- }
134
- const hasBoth = stdout.trim() && errorMessage
135
- return `${stdout.trim()}${hasBoth ? '\n' : ''}${errorMessage.trim()}`
136
- },
137
- async *call(
138
- { command, timeout = 120000 },
139
- { abortController, readFileTimestamps },
140
- ) {
141
- let stdout = ''
142
- let stderr = ''
143
-
144
- // 🔧 Check if already cancelled before starting execution
145
- if (abortController.signal.aborted) {
146
- const data: Out = {
147
- stdout: '',
148
- stdoutLines: 0,
149
- stderr: 'Command cancelled before execution',
150
- stderrLines: 1,
151
- interrupted: true,
152
- }
153
-
154
- yield {
155
- type: 'result',
156
- resultForAssistant: this.renderResultForAssistant(data),
157
- data,
158
- }
159
- return
160
- }
161
-
162
- try {
163
- // Execute commands
164
- const result = await PersistentShell.getInstance().exec(
165
- command,
166
- abortController.signal,
167
- timeout,
168
- )
169
- stdout += (result.stdout || '').trim() + EOL
170
- stderr += (result.stderr || '').trim() + EOL
171
- if (result.code !== 0) {
172
- stderr += `Exit code ${result.code}`
173
- }
174
-
175
- if (!isInDirectory(getCwd(), getOriginalCwd())) {
176
- // Shell directory is outside original working directory, reset it
177
- await PersistentShell.getInstance().setCwd(getOriginalCwd())
178
- stderr = `${stderr.trim()}${EOL}Shell cwd was reset to ${getOriginalCwd()}`
179
- logEvent('bash_tool_reset_to_original_dir', {})
180
- }
181
-
182
- // Update read timestamps for any files referenced by the command
183
- // Don't block the main thread!
184
- // Skip this in tests because it makes fixtures non-deterministic (they might not always get written),
185
- // so will be missing in CI.
186
- if (process.env.NODE_ENV !== 'test') {
187
- getCommandFilePaths(command, stdout).then(filePaths => {
188
- for (const filePath of filePaths) {
189
- const fullFilePath = isAbsolute(filePath)
190
- ? filePath
191
- : resolve(getCwd(), filePath)
192
-
193
- // Try/catch in case the file doesn't exist (because Haiku didn't properly extract it)
194
- try {
195
- readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs
196
- } catch (e) {
197
- logError(e)
198
- }
199
- }
200
- })
201
- }
202
-
203
- const { totalLines: stdoutLines, truncatedContent: stdoutContent } =
204
- formatOutput(stdout.trim())
205
- const { totalLines: stderrLines, truncatedContent: stderrContent } =
206
- formatOutput(stderr.trim())
207
-
208
- const data: Out = {
209
- stdout: stdoutContent,
210
- stdoutLines,
211
- stderr: stderrContent,
212
- stderrLines,
213
- interrupted: result.interrupted,
214
- }
215
-
216
- yield {
217
- type: 'result',
218
- resultForAssistant: this.renderResultForAssistant(data),
219
- data,
220
- }
221
- } catch (error) {
222
- // 🔧 Handle cancellation or other errors properly
223
- const isAborted = abortController.signal.aborted
224
- const errorMessage = isAborted
225
- ? 'Command was cancelled by user'
226
- : `Command failed: ${error instanceof Error ? error.message : String(error)}`
227
-
228
- const data: Out = {
229
- stdout: stdout.trim(),
230
- stdoutLines: stdout.split('\n').length,
231
- stderr: errorMessage,
232
- stderrLines: 1,
233
- interrupted: isAborted,
234
- }
235
-
236
- yield {
237
- type: 'result',
238
- resultForAssistant: this.renderResultForAssistant(data),
239
- data,
240
- }
241
- }
242
- },
243
- } satisfies Tool<In, Out>
@@ -1,38 +0,0 @@
1
- import { Box, Text } from 'ink'
2
- import { OutputLine } from './OutputLine'
3
- import React from 'react'
4
- import { getTheme } from '../../utils/theme'
5
- import { Out as BashOut } from './BashTool'
6
-
7
- type Props = {
8
- content: Omit<BashOut, 'interrupted'>
9
- verbose: boolean
10
- }
11
-
12
- function BashToolResultMessage({ content, verbose }: Props): React.JSX.Element {
13
- const { stdout, stdoutLines, stderr, stderrLines } = content
14
-
15
- return (
16
- <Box flexDirection="column">
17
- {stdout !== '' ? (
18
- <OutputLine content={stdout} lines={stdoutLines} verbose={verbose} />
19
- ) : null}
20
- {stderr !== '' ? (
21
- <OutputLine
22
- content={stderr}
23
- lines={stderrLines}
24
- verbose={verbose}
25
- isError
26
- />
27
- ) : null}
28
- {stdout === '' && stderr === '' ? (
29
- <Box flexDirection="row">
30
- <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
31
- <Text color={getTheme().secondaryText}>(No content)</Text>
32
- </Box>
33
- ) : null}
34
- </Box>
35
- )
36
- }
37
-
38
- export default BashToolResultMessage
@@ -1,49 +0,0 @@
1
- import { Box, Text } from 'ink'
2
- import * as React from 'react'
3
- import { getTheme } from '../../utils/theme'
4
- import { MAX_RENDERED_LINES } from './prompt'
5
- import chalk from 'chalk'
6
-
7
- function renderTruncatedContent(content: string, totalLines: number): string {
8
- const allLines = content.split('\n')
9
- if (allLines.length <= MAX_RENDERED_LINES) {
10
- return allLines.join('\n')
11
- }
12
-
13
- // Show last 5 lines of output by default (matching reference implementation)
14
- const lastLines = allLines.slice(-MAX_RENDERED_LINES)
15
- return [
16
- chalk.grey(
17
- `Showing last ${MAX_RENDERED_LINES} lines of ${totalLines} total lines`,
18
- ),
19
- ...lastLines,
20
- ].join('\n')
21
- }
22
-
23
- export function OutputLine({
24
- content,
25
- lines,
26
- verbose,
27
- isError,
28
- }: {
29
- content: string
30
- lines: number
31
- verbose: boolean
32
- isError?: boolean
33
- key?: React.Key
34
- }) {
35
- return (
36
- <Box justifyContent="space-between" width="100%">
37
- <Box flexDirection="row">
38
- <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
39
- <Box flexDirection="column">
40
- <Text color={isError ? getTheme().error : undefined}>
41
- {verbose
42
- ? content.trim()
43
- : renderTruncatedContent(content.trim(), lines)}
44
- </Text>
45
- </Box>
46
- </Box>
47
- </Box>
48
- )
49
- }
@@ -1,174 +0,0 @@
1
- import { PRODUCT_NAME, PRODUCT_URL } from '../../constants/product'
2
- import { TOOL_NAME as TASK_TOOL_NAME } from '../TaskTool/constants'
3
- import { FileReadTool } from '../FileReadTool/FileReadTool'
4
- import { TOOL_NAME_FOR_PROMPT as GLOB_TOOL_NAME } from '../GlobTool/prompt'
5
- import { TOOL_NAME_FOR_PROMPT as GREP_TOOL_NAME } from '../GrepTool/prompt'
6
- import { LSTool } from '../lsTool/lsTool'
7
-
8
- export const MAX_OUTPUT_LENGTH = 30000
9
- export const MAX_RENDERED_LINES = 5
10
- export const BANNED_COMMANDS = [
11
- 'alias',
12
- 'curl',
13
- 'curlie',
14
- 'wget',
15
- 'axel',
16
- 'aria2c',
17
- 'nc',
18
- 'telnet',
19
- 'lynx',
20
- 'w3m',
21
- 'links',
22
- 'httpie',
23
- 'xh',
24
- 'http-prompt',
25
- 'chrome',
26
- 'firefox',
27
- 'safari',
28
- ]
29
-
30
- export const PROMPT = `Executes a given bash command in a persistent shell session with optional timeout, ensuring proper handling and security measures.
31
-
32
- Before executing the command, please follow these steps:
33
-
34
- 1. Directory Verification:
35
- - If the command will create new directories or files, first use the LS tool to verify the parent directory exists and is the correct location
36
- - For example, before running "mkdir foo/bar", first use LS to check that "foo" exists and is the intended parent directory
37
-
38
- 2. Security Check:
39
- - For security and to limit the threat of a prompt injection attack, some commands are limited or banned. If you use a disallowed command, you will receive an error message explaining the restriction. Explain the error to the User.
40
- - Verify that the command is not one of the banned commands: ${BANNED_COMMANDS.join(', ')}.
41
-
42
- 3. Command Execution:
43
- - After ensuring proper quoting, execute the command.
44
- - Capture the output of the command.
45
-
46
- 4. Output Processing:
47
- - If the output exceeds ${MAX_OUTPUT_LENGTH} characters, output will be truncated before being returned to you.
48
- - Prepare the output for display to the user.
49
-
50
- 5. Return Result:
51
- - Provide the processed output of the command.
52
- - If any errors occurred during execution, include those in the output.
53
-
54
- Usage notes:
55
- - The command argument is required.
56
- - You can specify an optional timeout in milliseconds (up to 600000ms / 10 minutes). If not specified, commands will timeout after 30 minutes.
57
- - VERY IMPORTANT: You MUST avoid using search commands like \`find\` and \`grep\`. Instead use ${GREP_TOOL_NAME}, ${GLOB_TOOL_NAME}, or ${TASK_TOOL_NAME} to search. You MUST avoid read tools like \`cat\`, \`head\`, \`tail\`, and \`ls\`, and use ${FileReadTool.name} and ${LSTool.name} to read files.
58
- - When issuing multiple commands, use the ';' or '&&' operator to separate them. DO NOT use newlines (newlines are ok in quoted strings).
59
- - IMPORTANT: All commands share the same shell session. Shell state (environment variables, virtual environments, current directory, etc.) persist between commands. For example, if you set an environment variable as part of a command, the environment variable will persist for subsequent commands.
60
- - Try to maintain your current working directory throughout the session by using absolute paths and avoiding usage of \`cd\`. You may use \`cd\` if the User explicitly requests it.
61
- <good-example>
62
- pytest /foo/bar/tests
63
- </good-example>
64
- <bad-example>
65
- cd /foo/bar && pytest tests
66
- </bad-example>
67
-
68
- # Committing changes with git
69
-
70
- When the user asks you to create a new git commit, follow these steps carefully:
71
-
72
- 1. Start with a single message that contains exactly three tool_use blocks that do the following (it is VERY IMPORTANT that you send these tool_use blocks in a single message, otherwise it will feel slow to the user!):
73
- - Run a git status command to see all untracked files.
74
- - Run a git diff command to see both staged and unstaged changes that will be committed.
75
- - Run a git log command to see recent commit messages, so that you can follow this repository's commit message style.
76
-
77
- 2. Use the git context at the start of this conversation to determine which files are relevant to your commit. Add relevant untracked files to the staging area. Do not commit files that were already modified at the start of this conversation, if they are not relevant to your commit.
78
-
79
- 3. Analyze all staged changes (both previously staged and newly added) and draft a commit message. Wrap your analysis process in <commit_analysis> tags:
80
-
81
- <commit_analysis>
82
- - List the files that have been changed or added
83
- - Summarize the nature of the changes (eg. new feature, enhancement to an existing feature, bug fix, refactoring, test, docs, etc.)
84
- - Brainstorm the purpose or motivation behind these changes
85
- - Do not use tools to explore code, beyond what is available in the git context
86
- - Assess the impact of these changes on the overall project
87
- - Check for any sensitive information that shouldn't be committed
88
- - Draft a concise (1-2 sentences) commit message that focuses on the "why" rather than the "what"
89
- - Ensure your language is clear, concise, and to the point
90
- - Ensure the message accurately reflects the changes and their purpose (i.e. "add" means a wholly new feature, "update" means an enhancement to an existing feature, "fix" means a bug fix, etc.)
91
- - Ensure the message is not generic (avoid words like "Update" or "Fix" without context)
92
- - Review the draft message to ensure it accurately reflects the changes and their purpose
93
- </commit_analysis>
94
-
95
- 4. Create the commit with a message ending with:
96
- 🤖 Generated with ${PRODUCT_NAME} & {MODEL_NAME}
97
- Co-Authored-By: ${PRODUCT_NAME} <noreply@${PRODUCT_NAME}.com>
98
-
99
- - In order to ensure good formatting, ALWAYS pass the commit message via a HEREDOC, a la this example:
100
- <example>
101
- git commit -m "$(cat <<'EOF'
102
- Commit message here.
103
-
104
- 🤖 Generated with ${PRODUCT_NAME} & {MODEL_NAME}
105
- Co-Authored-By: ${PRODUCT_NAME} <noreply@${PRODUCT_NAME}.com>
106
- EOF
107
- )"
108
- </example>
109
-
110
- 5. If the commit fails due to pre-commit hook changes, retry the commit ONCE to include these automated changes. If it fails again, it usually means a pre-commit hook is preventing the commit. If the commit succeeds but you notice that files were modified by the pre-commit hook, you MUST amend your commit to include them.
111
-
112
- 6. Finally, run git status to make sure the commit succeeded.
113
-
114
- Important notes:
115
- - When possible, combine the "git add" and "git commit" commands into a single "git commit -am" command, to speed things up
116
- - However, be careful not to stage files (e.g. with \`git add .\`) for commits that aren't part of the change, they may have untracked files they want to keep around, but not commit.
117
- - NEVER update the git config
118
- - DO NOT push to the remote repository
119
- - IMPORTANT: Never use git commands with the -i flag (like git rebase -i or git add -i) since they require interactive input which is not supported.
120
- - If there are no changes to commit (i.e., no untracked files and no modifications), do not create an empty commit
121
- - Ensure your commit message is meaningful and concise. It should explain the purpose of the changes, not just describe them.
122
- - Return an empty response - the user will see the git output directly
123
-
124
- # Creating pull requests
125
- Use the gh command via the Bash tool for ALL GitHub-related tasks including working with issues, pull requests, checks, and releases. If given a Github URL use the gh command to get the information needed.
126
-
127
- IMPORTANT: When the user asks you to create a pull request, follow these steps carefully:
128
-
129
- 1. Understand the current state of the branch. Remember to send a single message that contains multiple tool_use blocks (it is VERY IMPORTANT that you do this in a single message, otherwise it will feel slow to the user!):
130
- - Run a git status command to see all untracked files.
131
- - Run a git diff command to see both staged and unstaged changes that will be committed.
132
- - Check if the current branch tracks a remote branch and is up to date with the remote, so you know if you need to push to the remote
133
- - Run a git log command and \`git diff main...HEAD\` to understand the full commit history for the current branch (from the time it diverged from the \`main\` branch.)
134
-
135
- 2. Create new branch if needed
136
-
137
- 3. Commit changes if needed
138
-
139
- 4. Push to remote with -u flag if needed
140
-
141
- 5. Analyze all changes that will be included in the pull request, making sure to look at all relevant commits (not just the latest commit, but all commits that will be included in the pull request!), and draft a pull request summary. Wrap your analysis process in <pr_analysis> tags:
142
-
143
- <pr_analysis>
144
- - List the commits since diverging from the main branch
145
- - Summarize the nature of the changes (eg. new feature, enhancement to an existing feature, bug fix, refactoring, test, docs, etc.)
146
- - Brainstorm the purpose or motivation behind these changes
147
- - Assess the impact of these changes on the overall project
148
- - Do not use tools to explore code, beyond what is available in the git context
149
- - Check for any sensitive information that shouldn't be committed
150
- - Draft a concise (1-2 bullet points) pull request summary that focuses on the "why" rather than the "what"
151
- - Ensure the summary accurately reflects all changes since diverging from the main branch
152
- - Ensure your language is clear, concise, and to the point
153
- - Ensure the summary accurately reflects the changes and their purpose (ie. "add" means a wholly new feature, "update" means an enhancement to an existing feature, "fix" means a bug fix, etc.)
154
- - Ensure the summary is not generic (avoid words like "Update" or "Fix" without context)
155
- - Review the draft summary to ensure it accurately reflects the changes and their purpose
156
- </pr_analysis>
157
-
158
- 6. Create PR using gh pr create with the format below. Use a HEREDOC to pass the body to ensure correct formatting.
159
- <example>
160
- gh pr create --title "the pr title" --body "$(cat <<'EOF'
161
- ## Summary
162
- <1-3 bullet points>
163
-
164
- ## Test plan
165
- [Checklist of TODOs for testing the pull request...]
166
-
167
- 🤖 Generated with ${process.env.USER_TYPE === 'ant' ? `[${PRODUCT_NAME}](${PRODUCT_URL})` : PRODUCT_NAME} & {MODEL_NAME}
168
- EOF
169
- )"
170
- </example>
171
-
172
- Important:
173
- - Return an empty response - the user will see the gh output directly
174
- - Never update git config`
@@ -1,56 +0,0 @@
1
- import { queryQuick } from '../../services/claude'
2
- import { extractTag } from '../../utils/messages'
3
- import { MAX_OUTPUT_LENGTH } from './prompt'
4
-
5
- export function formatOutput(content: string): {
6
- totalLines: number
7
- truncatedContent: string
8
- } {
9
- if (content.length <= MAX_OUTPUT_LENGTH) {
10
- return {
11
- totalLines: content.split('\n').length,
12
- truncatedContent: content,
13
- }
14
- }
15
- const halfLength = MAX_OUTPUT_LENGTH / 2
16
- const start = content.slice(0, halfLength)
17
- const end = content.slice(-halfLength)
18
- const truncated = `${start}\n\n... [${content.slice(halfLength, -halfLength).split('\n').length} lines truncated] ...\n\n${end}`
19
-
20
- return {
21
- totalLines: content.split('\n').length,
22
- truncatedContent: truncated,
23
- }
24
- }
25
-
26
- export async function getCommandFilePaths(
27
- command: string,
28
- output: string,
29
- ): Promise<string[]> {
30
- const response = await queryQuick({
31
- systemPrompt: [
32
- `Extract any file paths that this command reads or modifies. For commands like "git diff" and "cat", include the paths of files being shown. Use paths verbatim -- don't add any slashes or try to resolve them. Do not try to infer paths that were not explicitly listed in the command output.
33
- Format your response as:
34
- <filepaths>
35
- path/to/file1
36
- path/to/file2
37
- </filepaths>
38
-
39
- If no files are read or modified, return empty filepaths tags:
40
- <filepaths>
41
- </filepaths>
42
-
43
- Do not include any other text in your response.`,
44
- ],
45
- userPrompt: `Command: ${command}\nOutput: ${output}`,
46
- enablePromptCaching: true,
47
- })
48
- const content = response.message.content
49
- .filter(_ => _.type === 'text')
50
- .map(_ => _.text)
51
- .join('')
52
-
53
- return (
54
- extractTag(content, 'filepaths')?.trim().split('\n').filter(Boolean) || []
55
- )
56
- }