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