@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,103 +0,0 @@
1
- import { Box, Text } from 'ink'
2
- import React from 'react'
3
- import { z } from 'zod'
4
- import { Cost } from '../../components/Cost'
5
- import { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'
6
- import { Tool, ToolUseContext } from '../../Tool'
7
- import { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'
8
- import { SearchResult, searchProviders } from './searchProviders'
9
-
10
- const inputSchema = z.strictObject({
11
- query: z.string().describe('The search query'),
12
- })
13
-
14
- type Input = z.infer<typeof inputSchema>
15
- type Output = {
16
- durationMs: number
17
- results: SearchResult[]
18
- }
19
-
20
-
21
- export const WebSearchTool = {
22
- name: TOOL_NAME_FOR_PROMPT,
23
- async description() {
24
- return DESCRIPTION
25
- },
26
- userFacingName: () => 'Web Search',
27
- inputSchema,
28
- isReadOnly: () => true,
29
- isConcurrencySafe: () => true,
30
- async isEnabled() {
31
- return true
32
- },
33
- needsPermissions() {
34
- return false
35
- },
36
- async prompt() {
37
- return DESCRIPTION
38
- },
39
- renderToolUseMessage({ query }: Input) {
40
- return `Searching for: "${query}" using DuckDuckGo`
41
- },
42
- renderToolUseRejectedMessage() {
43
- return <FallbackToolUseRejectedMessage />
44
- },
45
- renderToolResultMessage(output: Output) {
46
- return (
47
- <Box justifyContent="space-between" width="100%">
48
- <Box flexDirection="row">
49
- <Text>&nbsp;&nbsp;⎿ &nbsp;Found </Text>
50
- <Text bold>{output.results.length} </Text>
51
- <Text>
52
- {output.results.length === 1 ? 'result' : 'results'} using DuckDuckGo
53
- </Text>
54
- </Box>
55
- <Cost costUSD={0} durationMs={output.durationMs} debug={false} />
56
- </Box>
57
- )
58
- },
59
- renderResultForAssistant(output: Output) {
60
- if (output.results.length === 0) {
61
- return `No results found using DuckDuckGo.`
62
- }
63
-
64
- let result = `Found ${output.results.length} search results using DuckDuckGo:\n\n`
65
-
66
- output.results.forEach((item, index) => {
67
- result += `${index + 1}. **${item.title}**\n`
68
- result += ` ${item.snippet}\n`
69
- result += ` Link: ${item.link}\n\n`
70
- })
71
-
72
- result += `You can reference these results to provide current, accurate information to the user.`
73
- return result
74
- },
75
- async *call({ query }: Input, {}: ToolUseContext) {
76
- const start = Date.now()
77
-
78
- try {
79
- const searchResults = await searchProviders.duckduckgo.search(query)
80
-
81
- const output: Output = {
82
- results: searchResults,
83
- durationMs: Date.now() - start,
84
- }
85
-
86
- yield {
87
- type: 'result' as const,
88
- resultForAssistant: this.renderResultForAssistant(output),
89
- data: output,
90
- }
91
- } catch (error: any) {
92
- const output: Output = {
93
- results: [],
94
- durationMs: Date.now() - start,
95
- }
96
- yield {
97
- type: 'result' as const,
98
- resultForAssistant: `An error occurred during web search with DuckDuckGo: ${error.message}`,
99
- data: output,
100
- }
101
- }
102
- },
103
- } satisfies Tool<typeof inputSchema, Output>
@@ -1,13 +0,0 @@
1
-
2
- export const TOOL_NAME_FOR_PROMPT = 'WebSearch'
3
- export const DESCRIPTION = `- Allows Kode to search the web and use the results to inform responses
4
- - Provides up-to-date information for current events and recent data
5
- - Returns search result information formatted as search result blocks
6
- - Use this tool for accessing information beyond the Kode's knowledge cutoff
7
- - Searches are performed automatically within a single API call using DuckDuckGo
8
-
9
- Usage notes:
10
- - Use when you need current information not in training data
11
- - Effective for recent news, current events, product updates, or real-time data
12
- - Search queries should be specific and well-targeted for best results
13
- - Results include both title and snippet content for context`
@@ -1,66 +0,0 @@
1
- import fetch from 'node-fetch'
2
- import { parse } from 'node-html-parser'
3
-
4
- export interface SearchResult {
5
- title: string
6
- snippet: string
7
- link: string
8
- }
9
-
10
- export interface SearchProvider {
11
- search: (query: string, apiKey?: string) => Promise<SearchResult[]>
12
- isEnabled: (apiKey?: string) => boolean
13
- }
14
-
15
-
16
- const duckDuckGoSearchProvider: SearchProvider = {
17
- isEnabled: () => true,
18
- search: async (query: string): Promise<SearchResult[]> => {
19
- const response = await fetch(`https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`, {
20
- headers: {
21
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
22
- }
23
- });
24
-
25
- if (!response.ok) {
26
- throw new Error(`DuckDuckGo search failed with status: ${response.status}`);
27
- }
28
-
29
- const html = await response.text();
30
- const root = parse(html);
31
- const results: SearchResult[] = [];
32
-
33
- const resultNodes = root.querySelectorAll('.result.web-result');
34
-
35
- for (const node of resultNodes) {
36
- const titleNode = node.querySelector('.result__a');
37
- const snippetNode = node.querySelector('.result__snippet');
38
-
39
- if (titleNode && snippetNode) {
40
- const title = titleNode.text;
41
- const link = titleNode.getAttribute('href');
42
- const snippet = snippetNode.text;
43
-
44
- if (title && link && snippet) {
45
- // Clean the link - DuckDuckGo doesn't use uddg parameter anymore
46
- let cleanLink = link;
47
- if (link.startsWith('https://duckduckgo.com/l/?uddg=')) {
48
- try {
49
- const url = new URL(link);
50
- cleanLink = url.searchParams.get('uddg') || link;
51
- } catch {
52
- cleanLink = link;
53
- }
54
- }
55
- results.push({ title: title.trim(), snippet: snippet.trim(), link: cleanLink });
56
- }
57
- }
58
- }
59
-
60
- return results;
61
- },
62
- }
63
-
64
- export const searchProviders = {
65
- duckduckgo: duckDuckGoSearchProvider,
66
- }
@@ -1,272 +0,0 @@
1
- import { readdirSync } from 'fs'
2
- import { Box, Text } from 'ink'
3
- import { basename, isAbsolute, join, relative, resolve, sep } from 'path'
4
- import * as React from 'react'
5
- import { z } from 'zod'
6
- import { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'
7
- import { Tool } from '../../Tool'
8
- import { logError } from '../../utils/log'
9
- import { getCwd } from '../../utils/state'
10
- import { getTheme } from '../../utils/theme'
11
- import { DESCRIPTION } from './prompt'
12
- import { hasReadPermission } from '../../utils/permissions/filesystem'
13
-
14
- const MAX_LINES = 5
15
- const MAX_FILES = 1000
16
- const TRUNCATED_MESSAGE = `There are more than ${MAX_FILES} files in the repository. Use the LS tool (passing a specific path), Bash tool, and other tools to explore nested directories. The first ${MAX_FILES} files and directories are included below:\n\n`
17
-
18
- const inputSchema = z.strictObject({
19
- path: z
20
- .string()
21
- .describe(
22
- 'The absolute path to the directory to list (must be absolute, not relative)',
23
- ),
24
- })
25
-
26
- // TODO: Kill this tool and use bash instead
27
- export const LSTool = {
28
- name: 'LS',
29
- async description() {
30
- return DESCRIPTION
31
- },
32
- inputSchema,
33
- userFacingName() {
34
- return 'List'
35
- },
36
- async isEnabled() {
37
- return true
38
- },
39
- isReadOnly() {
40
- return true
41
- },
42
- isConcurrencySafe() {
43
- return true // LSTool is read-only, safe for concurrent execution
44
- },
45
- needsPermissions({ path }) {
46
- return !hasReadPermission(path)
47
- },
48
- async prompt() {
49
- return DESCRIPTION
50
- },
51
- renderResultForAssistant(data) {
52
- return data
53
- },
54
- renderToolUseMessage({ path }, { verbose }) {
55
- const absolutePath = path
56
- ? isAbsolute(path)
57
- ? path
58
- : resolve(getCwd(), path)
59
- : undefined
60
- const relativePath = absolutePath ? relative(getCwd(), absolutePath) : '.'
61
- return `path: "${verbose ? path : relativePath}"`
62
- },
63
- renderToolUseRejectedMessage() {
64
- return <FallbackToolUseRejectedMessage />
65
- },
66
- renderToolResultMessage(content) {
67
- const verbose = false // Set default value for verbose
68
- if (typeof content !== 'string') {
69
- return null
70
- }
71
- const result = content.replace(TRUNCATED_MESSAGE, '')
72
- if (!result) {
73
- return null
74
- }
75
- return (
76
- <Box justifyContent="space-between" width="100%">
77
- <Box>
78
- <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
79
- <Box flexDirection="column" paddingLeft={0}>
80
- {result
81
- .split('\n')
82
- .filter(_ => _.trim() !== '')
83
- .slice(0, verbose ? undefined : MAX_LINES)
84
- .map((_, i) => (
85
- <React.Fragment key={i}>
86
- <Text>{_}</Text>
87
- </React.Fragment>
88
- ))}
89
- {!verbose && result.split('\n').length > MAX_LINES && (
90
- <Text color={getTheme().secondaryText}>
91
- ... (+{result.split('\n').length - MAX_LINES} items)
92
- </Text>
93
- )}
94
- </Box>
95
- </Box>
96
- </Box>
97
- )
98
- },
99
- async *call({ path }, { abortController }) {
100
- const fullFilePath = isAbsolute(path) ? path : resolve(getCwd(), path)
101
- const result = listDirectory(
102
- fullFilePath,
103
- getCwd(),
104
- abortController.signal,
105
- ).sort()
106
- const safetyWarning = `\nNOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`
107
-
108
- // Plain tree for user display without warning
109
- const userTree = printTree(createFileTree(result))
110
-
111
- // Tree with safety warning for assistant only
112
- const assistantTree = userTree
113
-
114
- if (result.length < MAX_FILES) {
115
- yield {
116
- type: 'result',
117
- data: userTree, // Show user the tree without the warning
118
- resultForAssistant: this.renderResultForAssistant(assistantTree), // Send warning only to assistant
119
- }
120
- } else {
121
- const userData = `${TRUNCATED_MESSAGE}${userTree}`
122
- const assistantData = `${TRUNCATED_MESSAGE}${assistantTree}`
123
- yield {
124
- type: 'result',
125
- data: userData, // Show user the truncated tree without the warning
126
- resultForAssistant: this.renderResultForAssistant(assistantData), // Send warning only to assistant
127
- }
128
- }
129
- },
130
- } satisfies Tool<typeof inputSchema, string>
131
-
132
- function listDirectory(
133
- initialPath: string,
134
- cwd: string,
135
- abortSignal: AbortSignal,
136
- ): string[] {
137
- const results: string[] = []
138
-
139
- const queue = [initialPath]
140
- while (queue.length > 0) {
141
- if (results.length > MAX_FILES) {
142
- return results
143
- }
144
-
145
- if (abortSignal.aborted) {
146
- return results
147
- }
148
-
149
- const path = queue.shift()!
150
- if (skip(path)) {
151
- continue
152
- }
153
-
154
- if (path !== initialPath) {
155
- results.push(relative(cwd, path) + sep)
156
- }
157
-
158
- let children
159
- try {
160
- children = readdirSync(path, { withFileTypes: true })
161
- } catch (e) {
162
- // eg. EPERM, EACCES, ENOENT, etc.
163
- logError(e)
164
- continue
165
- }
166
-
167
- for (const child of children) {
168
- if (child.isDirectory()) {
169
- queue.push(join(path, child.name) + sep)
170
- } else {
171
- const fileName = join(path, child.name)
172
- if (skip(fileName)) {
173
- continue
174
- }
175
- results.push(relative(cwd, fileName))
176
- if (results.length > MAX_FILES) {
177
- return results
178
- }
179
- }
180
- }
181
- }
182
-
183
- return results
184
- }
185
-
186
- type TreeNode = {
187
- name: string
188
- path: string
189
- type: 'file' | 'directory'
190
- children?: TreeNode[]
191
- }
192
-
193
- function createFileTree(sortedPaths: string[]): TreeNode[] {
194
- const root: TreeNode[] = []
195
-
196
- for (const path of sortedPaths) {
197
- const parts = path.split(sep)
198
- let currentLevel = root
199
- let currentPath = ''
200
-
201
- for (let i = 0; i < parts.length; i++) {
202
- const part = parts[i]!
203
- if (!part) {
204
- // directories have trailing slashes
205
- continue
206
- }
207
- currentPath = currentPath ? `${currentPath}${sep}${part}` : part
208
- const isLastPart = i === parts.length - 1
209
-
210
- const existingNode = currentLevel.find(node => node.name === part)
211
-
212
- if (existingNode) {
213
- currentLevel = existingNode.children || []
214
- } else {
215
- const newNode: TreeNode = {
216
- name: part,
217
- path: currentPath,
218
- type: isLastPart ? 'file' : 'directory',
219
- }
220
-
221
- if (!isLastPart) {
222
- newNode.children = []
223
- }
224
-
225
- currentLevel.push(newNode)
226
- currentLevel = newNode.children || []
227
- }
228
- }
229
- }
230
-
231
- return root
232
- }
233
-
234
- /**
235
- * eg.
236
- * - src/
237
- * - index.ts
238
- * - utils/
239
- * - file.ts
240
- */
241
- function printTree(tree: TreeNode[], level = 0, prefix = ''): string {
242
- let result = ''
243
-
244
- // Add absolute path at root level
245
- if (level === 0) {
246
- result += `- ${getCwd()}${sep}\n`
247
- prefix = ' '
248
- }
249
-
250
- for (const node of tree) {
251
- // Add the current node to the result
252
- result += `${prefix}${'-'} ${node.name}${node.type === 'directory' ? sep : ''}\n`
253
-
254
- // Recursively print children if they exist
255
- if (node.children && node.children.length > 0) {
256
- result += printTree(node.children, level + 1, `${prefix} `)
257
- }
258
- }
259
-
260
- return result
261
- }
262
-
263
- // TODO: Add windows support
264
- function skip(path: string): boolean {
265
- if (path !== '.' && basename(path).startsWith('.')) {
266
- return true
267
- }
268
- if (path.includes(`__pycache__${sep}`)) {
269
- return true
270
- }
271
- return false
272
- }
@@ -1,2 +0,0 @@
1
- export const DESCRIPTION =
2
- 'Lists files and directories in a given path. The path parameter must be an absolute path, not a relative path. You should generally prefer the Glob and Grep tools, if you know which directories to search.'
package/src/tools.ts DELETED
@@ -1,67 +0,0 @@
1
- import { Tool } from './Tool'
2
- import { TaskTool } from './tools/TaskTool/TaskTool'
3
- import { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'
4
- import { BashTool } from './tools/BashTool/BashTool'
5
- import { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'
6
- import { FileEditTool } from './tools/FileEditTool/FileEditTool'
7
- import { FileReadTool } from './tools/FileReadTool/FileReadTool'
8
- import { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'
9
- import { GlobTool } from './tools/GlobTool/GlobTool'
10
- import { GrepTool } from './tools/GrepTool/GrepTool'
11
- import { LSTool } from './tools/lsTool/lsTool'
12
- import { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'
13
- import { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'
14
- import { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'
15
- import { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'
16
- import { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'
17
- import { ThinkTool } from './tools/ThinkTool/ThinkTool'
18
- import { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'
19
- import { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'
20
- import { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'
21
- import { getMCPTools } from './services/mcpClient'
22
- import { memoize } from 'lodash-es'
23
-
24
- const ANT_ONLY_TOOLS = [MemoryReadTool as unknown as Tool, MemoryWriteTool as unknown as Tool]
25
-
26
- // Function to avoid circular dependencies that break bun
27
- export const getAllTools = (): Tool[] => {
28
- return [
29
- TaskTool as unknown as Tool,
30
- AskExpertModelTool as unknown as Tool,
31
- BashTool as unknown as Tool,
32
- GlobTool as unknown as Tool,
33
- GrepTool as unknown as Tool,
34
- LSTool as unknown as Tool,
35
- FileReadTool as unknown as Tool,
36
- FileEditTool as unknown as Tool,
37
- MultiEditTool as unknown as Tool,
38
- FileWriteTool as unknown as Tool,
39
- NotebookReadTool as unknown as Tool,
40
- NotebookEditTool as unknown as Tool,
41
- ThinkTool as unknown as Tool,
42
- TodoWriteTool as unknown as Tool,
43
- WebSearchTool as unknown as Tool,
44
- URLFetcherTool as unknown as Tool,
45
- ...ANT_ONLY_TOOLS,
46
- ]
47
- }
48
-
49
- export const getTools = memoize(
50
- async (enableArchitect?: boolean): Promise<Tool[]> => {
51
- const tools = [...getAllTools(), ...(await getMCPTools())]
52
-
53
- // Only include Architect tool if enabled via config or CLI flag
54
- if (enableArchitect) {
55
- tools.push(ArchitectTool as unknown as Tool)
56
- }
57
-
58
- const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))
59
- return tools.filter((_, i) => isEnabled[i])
60
- },
61
- )
62
-
63
- export const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {
64
- const tools = getAllTools().filter(tool => tool.isReadOnly())
65
- const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))
66
- return tools.filter((_, index) => isEnabled[index])
67
- })
@@ -1,120 +0,0 @@
1
- // Permission mode types based on original Claude Code implementation
2
- export type PermissionMode =
3
- | 'default'
4
- | 'acceptEdits'
5
- | 'plan'
6
- | 'bypassPermissions'
7
-
8
- export interface PermissionContext {
9
- mode: PermissionMode
10
- allowedTools: string[]
11
- allowedPaths: string[]
12
- restrictions: {
13
- readOnly: boolean
14
- requireConfirmation: boolean
15
- bypassValidation: boolean
16
- }
17
- metadata: {
18
- activatedAt?: string
19
- previousMode?: PermissionMode
20
- transitionCount: number
21
- }
22
- }
23
-
24
- export interface ModeConfig {
25
- name: PermissionMode
26
- label: string
27
- icon: string
28
- color: string
29
- description: string
30
- allowedTools: string[]
31
- restrictions: {
32
- readOnly: boolean
33
- requireConfirmation: boolean
34
- bypassValidation: boolean
35
- }
36
- }
37
-
38
- // Mode configuration based on original Claude Code
39
- export const MODE_CONFIGS: Record<PermissionMode, ModeConfig> = {
40
- default: {
41
- name: 'default',
42
- label: 'DEFAULT',
43
- icon: '🔒',
44
- color: 'blue',
45
- description: 'Standard permission checking',
46
- allowedTools: ['*'],
47
- restrictions: {
48
- readOnly: false,
49
- requireConfirmation: true,
50
- bypassValidation: false,
51
- },
52
- },
53
- acceptEdits: {
54
- name: 'acceptEdits',
55
- label: 'ACCEPT EDITS',
56
- icon: '✅',
57
- color: 'green',
58
- description: 'Auto-approve edit operations',
59
- allowedTools: ['*'],
60
- restrictions: {
61
- readOnly: false,
62
- requireConfirmation: false,
63
- bypassValidation: false,
64
- },
65
- },
66
- plan: {
67
- name: 'plan',
68
- label: 'PLAN MODE',
69
- icon: '📝',
70
- color: 'yellow',
71
- description: 'Research and planning - read-only tools only',
72
- allowedTools: [
73
- 'Read',
74
- 'Grep',
75
- 'Glob',
76
- 'LS',
77
- 'WebSearch',
78
- 'WebFetch',
79
- 'NotebookRead',
80
- 'exit_plan_mode',
81
- ],
82
- restrictions: {
83
- readOnly: true,
84
- requireConfirmation: true,
85
- bypassValidation: false,
86
- },
87
- },
88
- bypassPermissions: {
89
- name: 'bypassPermissions',
90
- label: 'BYPASS PERMISSIONS',
91
- icon: '🔓',
92
- color: 'red',
93
- description: 'All permissions bypassed',
94
- allowedTools: ['*'],
95
- restrictions: {
96
- readOnly: false,
97
- requireConfirmation: false,
98
- bypassValidation: true,
99
- },
100
- },
101
- }
102
-
103
- // Mode cycling function (based on original yg2 function)
104
- export function getNextPermissionMode(
105
- currentMode: PermissionMode,
106
- isBypassAvailable: boolean = true,
107
- ): PermissionMode {
108
- switch (currentMode) {
109
- case 'default':
110
- return 'acceptEdits'
111
- case 'acceptEdits':
112
- return 'plan'
113
- case 'plan':
114
- return isBypassAvailable ? 'bypassPermissions' : 'default'
115
- case 'bypassPermissions':
116
- return 'default'
117
- default:
118
- return 'default'
119
- }
120
- }