@shareai-lab/kode 1.0.70 → 1.0.71

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 (253) hide show
  1. package/README.md +202 -76
  2. package/README.zh-CN.md +246 -0
  3. package/cli.js +62 -0
  4. package/package.json +45 -25
  5. package/scripts/postinstall.js +56 -0
  6. package/src/ProjectOnboarding.tsx +180 -0
  7. package/src/Tool.ts +53 -0
  8. package/src/commands/approvedTools.ts +53 -0
  9. package/src/commands/bug.tsx +20 -0
  10. package/src/commands/clear.ts +43 -0
  11. package/src/commands/compact.ts +120 -0
  12. package/src/commands/config.tsx +19 -0
  13. package/src/commands/cost.ts +18 -0
  14. package/src/commands/ctx_viz.ts +209 -0
  15. package/src/commands/doctor.ts +24 -0
  16. package/src/commands/help.tsx +19 -0
  17. package/src/commands/init.ts +37 -0
  18. package/src/commands/listen.ts +42 -0
  19. package/src/commands/login.tsx +51 -0
  20. package/src/commands/logout.tsx +40 -0
  21. package/src/commands/mcp.ts +41 -0
  22. package/src/commands/model.tsx +40 -0
  23. package/src/commands/modelstatus.tsx +20 -0
  24. package/src/commands/onboarding.tsx +34 -0
  25. package/src/commands/pr_comments.ts +59 -0
  26. package/src/commands/refreshCommands.ts +54 -0
  27. package/src/commands/release-notes.ts +34 -0
  28. package/src/commands/resume.tsx +30 -0
  29. package/src/commands/review.ts +49 -0
  30. package/src/commands/terminalSetup.ts +221 -0
  31. package/src/commands.ts +136 -0
  32. package/src/components/ApproveApiKey.tsx +93 -0
  33. package/src/components/AsciiLogo.tsx +13 -0
  34. package/src/components/AutoUpdater.tsx +148 -0
  35. package/src/components/Bug.tsx +367 -0
  36. package/src/components/Config.tsx +289 -0
  37. package/src/components/ConsoleOAuthFlow.tsx +326 -0
  38. package/src/components/Cost.tsx +23 -0
  39. package/src/components/CostThresholdDialog.tsx +46 -0
  40. package/src/components/CustomSelect/option-map.ts +42 -0
  41. package/src/components/CustomSelect/select-option.tsx +52 -0
  42. package/src/components/CustomSelect/select.tsx +143 -0
  43. package/src/components/CustomSelect/use-select-state.ts +414 -0
  44. package/src/components/CustomSelect/use-select.ts +35 -0
  45. package/src/components/FallbackToolUseRejectedMessage.tsx +15 -0
  46. package/src/components/FileEditToolUpdatedMessage.tsx +66 -0
  47. package/src/components/Help.tsx +215 -0
  48. package/src/components/HighlightedCode.tsx +33 -0
  49. package/src/components/InvalidConfigDialog.tsx +113 -0
  50. package/src/components/Link.tsx +32 -0
  51. package/src/components/LogSelector.tsx +86 -0
  52. package/src/components/Logo.tsx +145 -0
  53. package/src/components/MCPServerApprovalDialog.tsx +100 -0
  54. package/src/components/MCPServerDialogCopy.tsx +25 -0
  55. package/src/components/MCPServerMultiselectDialog.tsx +109 -0
  56. package/src/components/Message.tsx +219 -0
  57. package/src/components/MessageResponse.tsx +15 -0
  58. package/src/components/MessageSelector.tsx +211 -0
  59. package/src/components/ModeIndicator.tsx +88 -0
  60. package/src/components/ModelConfig.tsx +301 -0
  61. package/src/components/ModelListManager.tsx +223 -0
  62. package/src/components/ModelSelector.tsx +3208 -0
  63. package/src/components/ModelStatusDisplay.tsx +228 -0
  64. package/src/components/Onboarding.tsx +274 -0
  65. package/src/components/PressEnterToContinue.tsx +11 -0
  66. package/src/components/PromptInput.tsx +710 -0
  67. package/src/components/SentryErrorBoundary.ts +33 -0
  68. package/src/components/Spinner.tsx +129 -0
  69. package/src/components/StructuredDiff.tsx +184 -0
  70. package/src/components/TextInput.tsx +246 -0
  71. package/src/components/TokenWarning.tsx +31 -0
  72. package/src/components/ToolUseLoader.tsx +40 -0
  73. package/src/components/TrustDialog.tsx +106 -0
  74. package/src/components/binary-feedback/BinaryFeedback.tsx +63 -0
  75. package/src/components/binary-feedback/BinaryFeedbackOption.tsx +111 -0
  76. package/src/components/binary-feedback/BinaryFeedbackView.tsx +172 -0
  77. package/src/components/binary-feedback/utils.ts +220 -0
  78. package/src/components/messages/AssistantBashOutputMessage.tsx +22 -0
  79. package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +45 -0
  80. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +19 -0
  81. package/src/components/messages/AssistantTextMessage.tsx +144 -0
  82. package/src/components/messages/AssistantThinkingMessage.tsx +40 -0
  83. package/src/components/messages/AssistantToolUseMessage.tsx +123 -0
  84. package/src/components/messages/UserBashInputMessage.tsx +28 -0
  85. package/src/components/messages/UserCommandMessage.tsx +30 -0
  86. package/src/components/messages/UserKodingInputMessage.tsx +28 -0
  87. package/src/components/messages/UserPromptMessage.tsx +35 -0
  88. package/src/components/messages/UserTextMessage.tsx +39 -0
  89. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +12 -0
  90. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +36 -0
  91. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +31 -0
  92. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +57 -0
  93. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +35 -0
  94. package/src/components/messages/UserToolResultMessage/utils.tsx +56 -0
  95. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +121 -0
  96. package/src/components/permissions/FallbackPermissionRequest.tsx +155 -0
  97. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  98. package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +75 -0
  99. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +164 -0
  100. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +81 -0
  101. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +242 -0
  102. package/src/components/permissions/PermissionRequest.tsx +103 -0
  103. package/src/components/permissions/PermissionRequestTitle.tsx +69 -0
  104. package/src/components/permissions/hooks.ts +44 -0
  105. package/src/components/permissions/toolUseOptions.ts +59 -0
  106. package/src/components/permissions/utils.ts +23 -0
  107. package/src/constants/betas.ts +5 -0
  108. package/src/constants/claude-asterisk-ascii-art.tsx +238 -0
  109. package/src/constants/figures.ts +4 -0
  110. package/src/constants/keys.ts +3 -0
  111. package/src/constants/macros.ts +6 -0
  112. package/src/constants/models.ts +935 -0
  113. package/src/constants/oauth.ts +18 -0
  114. package/src/constants/product.ts +17 -0
  115. package/src/constants/prompts.ts +177 -0
  116. package/src/constants/releaseNotes.ts +7 -0
  117. package/src/context/PermissionContext.tsx +149 -0
  118. package/src/context.ts +278 -0
  119. package/src/cost-tracker.ts +84 -0
  120. package/src/entrypoints/cli.tsx +1498 -0
  121. package/src/entrypoints/mcp.ts +176 -0
  122. package/src/history.ts +25 -0
  123. package/src/hooks/useApiKeyVerification.ts +59 -0
  124. package/src/hooks/useArrowKeyHistory.ts +55 -0
  125. package/src/hooks/useCanUseTool.ts +138 -0
  126. package/src/hooks/useCancelRequest.ts +39 -0
  127. package/src/hooks/useDoublePress.ts +42 -0
  128. package/src/hooks/useExitOnCtrlCD.ts +31 -0
  129. package/src/hooks/useInterval.ts +25 -0
  130. package/src/hooks/useLogMessages.ts +16 -0
  131. package/src/hooks/useLogStartupTime.ts +12 -0
  132. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  133. package/src/hooks/usePermissionRequestLogging.ts +44 -0
  134. package/src/hooks/useSlashCommandTypeahead.ts +137 -0
  135. package/src/hooks/useTerminalSize.ts +49 -0
  136. package/src/hooks/useTextInput.ts +315 -0
  137. package/src/messages.ts +37 -0
  138. package/src/permissions.ts +268 -0
  139. package/src/query.ts +704 -0
  140. package/src/screens/ConfigureNpmPrefix.tsx +197 -0
  141. package/src/screens/Doctor.tsx +219 -0
  142. package/src/screens/LogList.tsx +68 -0
  143. package/src/screens/REPL.tsx +792 -0
  144. package/src/screens/ResumeConversation.tsx +68 -0
  145. package/src/services/browserMocks.ts +66 -0
  146. package/src/services/claude.ts +1947 -0
  147. package/src/services/customCommands.ts +683 -0
  148. package/src/services/fileFreshness.ts +377 -0
  149. package/src/services/mcpClient.ts +564 -0
  150. package/src/services/mcpServerApproval.tsx +50 -0
  151. package/src/services/notifier.ts +40 -0
  152. package/src/services/oauth.ts +357 -0
  153. package/src/services/openai.ts +796 -0
  154. package/src/services/sentry.ts +3 -0
  155. package/src/services/statsig.ts +171 -0
  156. package/src/services/statsigStorage.ts +86 -0
  157. package/src/services/systemReminder.ts +406 -0
  158. package/src/services/vcr.ts +161 -0
  159. package/src/tools/ArchitectTool/ArchitectTool.tsx +122 -0
  160. package/src/tools/ArchitectTool/prompt.ts +15 -0
  161. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +505 -0
  162. package/src/tools/BashTool/BashTool.tsx +270 -0
  163. package/src/tools/BashTool/BashToolResultMessage.tsx +38 -0
  164. package/src/tools/BashTool/OutputLine.tsx +48 -0
  165. package/src/tools/BashTool/prompt.ts +174 -0
  166. package/src/tools/BashTool/utils.ts +56 -0
  167. package/src/tools/FileEditTool/FileEditTool.tsx +316 -0
  168. package/src/tools/FileEditTool/prompt.ts +51 -0
  169. package/src/tools/FileEditTool/utils.ts +58 -0
  170. package/src/tools/FileReadTool/FileReadTool.tsx +371 -0
  171. package/src/tools/FileReadTool/prompt.ts +7 -0
  172. package/src/tools/FileWriteTool/FileWriteTool.tsx +297 -0
  173. package/src/tools/FileWriteTool/prompt.ts +10 -0
  174. package/src/tools/GlobTool/GlobTool.tsx +119 -0
  175. package/src/tools/GlobTool/prompt.ts +8 -0
  176. package/src/tools/GrepTool/GrepTool.tsx +147 -0
  177. package/src/tools/GrepTool/prompt.ts +11 -0
  178. package/src/tools/MCPTool/MCPTool.tsx +106 -0
  179. package/src/tools/MCPTool/prompt.ts +3 -0
  180. package/src/tools/MemoryReadTool/MemoryReadTool.tsx +127 -0
  181. package/src/tools/MemoryReadTool/prompt.ts +3 -0
  182. package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +89 -0
  183. package/src/tools/MemoryWriteTool/prompt.ts +3 -0
  184. package/src/tools/MultiEditTool/MultiEditTool.tsx +366 -0
  185. package/src/tools/MultiEditTool/prompt.ts +45 -0
  186. package/src/tools/NotebookEditTool/NotebookEditTool.tsx +298 -0
  187. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  188. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +266 -0
  189. package/src/tools/NotebookReadTool/prompt.ts +3 -0
  190. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +93 -0
  191. package/src/tools/StickerRequestTool/prompt.ts +19 -0
  192. package/src/tools/TaskTool/TaskTool.tsx +382 -0
  193. package/src/tools/TaskTool/constants.ts +1 -0
  194. package/src/tools/TaskTool/prompt.ts +56 -0
  195. package/src/tools/ThinkTool/ThinkTool.tsx +56 -0
  196. package/src/tools/ThinkTool/prompt.ts +12 -0
  197. package/src/tools/TodoWriteTool/TodoWriteTool.tsx +289 -0
  198. package/src/tools/TodoWriteTool/prompt.ts +63 -0
  199. package/src/tools/lsTool/lsTool.tsx +269 -0
  200. package/src/tools/lsTool/prompt.ts +2 -0
  201. package/src/tools.ts +63 -0
  202. package/src/types/PermissionMode.ts +120 -0
  203. package/src/types/RequestContext.ts +72 -0
  204. package/src/utils/Cursor.ts +436 -0
  205. package/src/utils/PersistentShell.ts +373 -0
  206. package/src/utils/agentStorage.ts +97 -0
  207. package/src/utils/array.ts +3 -0
  208. package/src/utils/ask.tsx +98 -0
  209. package/src/utils/auth.ts +13 -0
  210. package/src/utils/autoCompactCore.ts +223 -0
  211. package/src/utils/autoUpdater.ts +318 -0
  212. package/src/utils/betas.ts +20 -0
  213. package/src/utils/browser.ts +14 -0
  214. package/src/utils/cleanup.ts +72 -0
  215. package/src/utils/commands.ts +261 -0
  216. package/src/utils/config.ts +771 -0
  217. package/src/utils/conversationRecovery.ts +54 -0
  218. package/src/utils/debugLogger.ts +1123 -0
  219. package/src/utils/diff.ts +42 -0
  220. package/src/utils/env.ts +57 -0
  221. package/src/utils/errors.ts +21 -0
  222. package/src/utils/exampleCommands.ts +108 -0
  223. package/src/utils/execFileNoThrow.ts +51 -0
  224. package/src/utils/expertChatStorage.ts +136 -0
  225. package/src/utils/file.ts +402 -0
  226. package/src/utils/fileRecoveryCore.ts +71 -0
  227. package/src/utils/format.tsx +44 -0
  228. package/src/utils/generators.ts +62 -0
  229. package/src/utils/git.ts +92 -0
  230. package/src/utils/globalLogger.ts +77 -0
  231. package/src/utils/http.ts +10 -0
  232. package/src/utils/imagePaste.ts +38 -0
  233. package/src/utils/json.ts +13 -0
  234. package/src/utils/log.ts +382 -0
  235. package/src/utils/markdown.ts +213 -0
  236. package/src/utils/messageContextManager.ts +289 -0
  237. package/src/utils/messages.tsx +938 -0
  238. package/src/utils/model.ts +836 -0
  239. package/src/utils/permissions/filesystem.ts +118 -0
  240. package/src/utils/ripgrep.ts +167 -0
  241. package/src/utils/sessionState.ts +49 -0
  242. package/src/utils/state.ts +25 -0
  243. package/src/utils/style.ts +29 -0
  244. package/src/utils/terminal.ts +49 -0
  245. package/src/utils/theme.ts +122 -0
  246. package/src/utils/thinking.ts +144 -0
  247. package/src/utils/todoStorage.ts +431 -0
  248. package/src/utils/tokens.ts +43 -0
  249. package/src/utils/toolExecutionController.ts +163 -0
  250. package/src/utils/unaryLogging.ts +26 -0
  251. package/src/utils/user.ts +37 -0
  252. package/src/utils/validate.ts +165 -0
  253. package/cli.mjs +0 -1803
@@ -0,0 +1,161 @@
1
+ import { createHash, type UUID } from 'crypto'
2
+ import { mkdirSync, readFileSync, writeFileSync } from 'fs'
3
+ import { dirname } from 'path'
4
+ import type { AssistantMessage, UserMessage } from '../query'
5
+ import { existsSync } from 'fs'
6
+ import { env } from '../utils/env'
7
+ import { getCwd } from '../utils/state'
8
+ import * as path from 'path'
9
+ import { mapValues } from 'lodash-es'
10
+ import type { ContentBlock } from '@anthropic-ai/sdk/resources/index.mjs'
11
+
12
+ export async function withVCR(
13
+ messages: (UserMessage | AssistantMessage)[],
14
+ f: () => Promise<AssistantMessage>,
15
+ ): Promise<AssistantMessage> {
16
+ if (process.env.NODE_ENV !== 'test') {
17
+ return await f()
18
+ }
19
+
20
+ const dehydratedInput = mapMessages(
21
+ messages.map(_ => _.message.content),
22
+ dehydrateValue,
23
+ )
24
+ const filename = `./fixtures/${dehydratedInput.map(_ => createHash('sha1').update(JSON.stringify(_)).digest('hex').slice(0, 6)).join('-')}.json`
25
+
26
+ // Fetch cached fixture
27
+ if (existsSync(filename)) {
28
+ const cached = JSON.parse(readFileSync(filename, 'utf-8'))
29
+ return mapAssistantMessage(cached.output, hydrateValue)
30
+ }
31
+
32
+ if (env.isCI) {
33
+ console.warn(
34
+ `Anthropic API fixture missing. Re-run npm test locally, then commit the result. ${JSON.stringify({ input: dehydratedInput }, null, 2)}`,
35
+ )
36
+ }
37
+
38
+ // Create & write new fixture
39
+ const result = await f()
40
+ if (env.isCI) {
41
+ return result
42
+ }
43
+
44
+ if (!existsSync(dirname(filename))) {
45
+ mkdirSync(dirname(filename), { recursive: true })
46
+ }
47
+ writeFileSync(
48
+ filename,
49
+ JSON.stringify(
50
+ {
51
+ input: dehydratedInput,
52
+ output: mapAssistantMessage(result, dehydrateValue),
53
+ },
54
+ null,
55
+ 2,
56
+ ),
57
+ )
58
+ return result
59
+ }
60
+
61
+ function mapMessages(
62
+ messages: (UserMessage | AssistantMessage)['message']['content'][],
63
+ f: (s: unknown) => unknown,
64
+ ): (UserMessage | AssistantMessage)['message']['content'][] {
65
+ return messages.map(_ => {
66
+ if (typeof _ === 'string') {
67
+ return f(_)
68
+ }
69
+ return _.map(_ => {
70
+ switch (_.type) {
71
+ case 'tool_result':
72
+ if (typeof _.content === 'string') {
73
+ return { ..._, content: f(_.content) }
74
+ }
75
+ if (Array.isArray(_.content)) {
76
+ return {
77
+ ..._,
78
+ content: _.content.map(_ => {
79
+ switch (_.type) {
80
+ case 'text':
81
+ return { ..._, text: f(_.text) }
82
+ case 'image':
83
+ return _
84
+ }
85
+ }),
86
+ }
87
+ }
88
+ return _
89
+ case 'text':
90
+ return { ..._, text: f(_.text) }
91
+ case 'tool_use':
92
+ return {
93
+ ..._,
94
+ input: mapValues(_.input as Record<string, unknown>, f),
95
+ }
96
+ case 'image':
97
+ return _
98
+ }
99
+ })
100
+ }) as (UserMessage | AssistantMessage)['message']['content'][]
101
+ }
102
+
103
+ function mapAssistantMessage(
104
+ message: AssistantMessage,
105
+ f: (s: unknown) => unknown,
106
+ ): AssistantMessage {
107
+ return {
108
+ durationMs: 'DURATION' as unknown as number,
109
+ costUSD: 'COST' as unknown as number,
110
+ uuid: 'UUID' as unknown as UUID,
111
+ message: {
112
+ ...message.message,
113
+ content: message.message.content
114
+ .map(_ => {
115
+ switch (_.type) {
116
+ case 'text':
117
+ return {
118
+ ..._,
119
+ text: f(_.text) as string,
120
+ citations: _.citations || [],
121
+ } // Ensure citations
122
+ case 'tool_use':
123
+ return {
124
+ ..._,
125
+ input: mapValues(_.input as Record<string, unknown>, f),
126
+ }
127
+ default:
128
+ return _ // Handle other block types unchanged
129
+ }
130
+ })
131
+ .filter(Boolean) as ContentBlock[],
132
+ },
133
+ type: 'assistant',
134
+ }
135
+ }
136
+
137
+ function dehydrateValue(s: unknown): unknown {
138
+ if (typeof s !== 'string') {
139
+ return s
140
+ }
141
+ const s1 = s
142
+ .replace(/num_files="\d+"/g, 'num_files="[NUM]"')
143
+ .replace(/duration_ms="\d+"/g, 'duration_ms="[DURATION]"')
144
+ .replace(/cost_usd="\d+"/g, 'cost_usd="[COST]"')
145
+ .replace(/\//g, path.sep)
146
+ .replaceAll(getCwd(), '[CWD]')
147
+ if (s1.includes('Files modified by user:')) {
148
+ return 'Files modified by user: [FILES]'
149
+ }
150
+ return s1
151
+ }
152
+
153
+ function hydrateValue(s: unknown): unknown {
154
+ if (typeof s !== 'string') {
155
+ return s
156
+ }
157
+ return s
158
+ .replaceAll('[NUM]', '1')
159
+ .replaceAll('[DURATION]', '100')
160
+ .replaceAll('[CWD]', getCwd())
161
+ }
@@ -0,0 +1,122 @@
1
+ import type { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'
2
+ import { Box } from 'ink'
3
+ import * as React from 'react'
4
+ import { z } from 'zod'
5
+ import type { Tool } from '../../Tool'
6
+ import { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'
7
+ import { HighlightedCode } from '../../components/HighlightedCode'
8
+ import { getContext } from '../../context'
9
+ import { Message, query } from '../../query'
10
+ import { lastX } from '../../utils/generators'
11
+ import { createUserMessage } from '../../utils/messages'
12
+ import { BashTool } from '../BashTool/BashTool'
13
+ import { FileReadTool } from '../FileReadTool/FileReadTool'
14
+ import { FileWriteTool } from '../FileWriteTool/FileWriteTool'
15
+ import { GlobTool } from '../GlobTool/GlobTool'
16
+ import { GrepTool } from '../GrepTool/GrepTool'
17
+ import { LSTool } from '../lsTool/lsTool'
18
+ import { ARCHITECT_SYSTEM_PROMPT, DESCRIPTION } from './prompt'
19
+
20
+ const FS_EXPLORATION_TOOLS: Tool[] = [
21
+ BashTool,
22
+ LSTool,
23
+ FileReadTool,
24
+ FileWriteTool,
25
+ GlobTool,
26
+ GrepTool,
27
+ ]
28
+
29
+ const inputSchema = z.strictObject({
30
+ prompt: z
31
+ .string()
32
+ .describe('The technical request or coding task to analyze'),
33
+ context: z
34
+ .string()
35
+ .describe('Optional context from previous conversation or system state')
36
+ .optional(),
37
+ })
38
+
39
+ export const ArchitectTool = {
40
+ name: 'Architect',
41
+ async description() {
42
+ return DESCRIPTION
43
+ },
44
+ inputSchema,
45
+ isReadOnly() {
46
+ return true
47
+ },
48
+ isConcurrencySafe() {
49
+ return true // ArchitectTool is read-only, safe for concurrent execution
50
+ },
51
+ userFacingName() {
52
+ return 'Architect'
53
+ },
54
+ async isEnabled() {
55
+ return false
56
+ },
57
+ needsPermissions() {
58
+ return false
59
+ },
60
+ async *call({ prompt, context }, toolUseContext, canUseTool) {
61
+ const content = context
62
+ ? `<context>${context}</context>\n\n${prompt}`
63
+ : prompt
64
+
65
+ const userMessage = createUserMessage(content)
66
+
67
+ const messages: Message[] = [userMessage]
68
+
69
+ // We only allow the file exploration tools to be used in the architect tool
70
+ const allowedTools = (toolUseContext.options.tools ?? []).filter(_ =>
71
+ FS_EXPLORATION_TOOLS.map(_ => _.name).includes(_.name),
72
+ )
73
+
74
+ const lastResponse = await lastX(
75
+ query(
76
+ messages,
77
+ [ARCHITECT_SYSTEM_PROMPT],
78
+ await getContext(),
79
+ canUseTool,
80
+ {
81
+ ...toolUseContext,
82
+ options: { ...toolUseContext.options, tools: allowedTools },
83
+ },
84
+ ),
85
+ )
86
+
87
+ if (lastResponse.type !== 'assistant') {
88
+ throw new Error(`Invalid response from API`)
89
+ }
90
+
91
+ const data = lastResponse.message.content.filter(_ => _.type === 'text')
92
+ yield {
93
+ type: 'result',
94
+ data,
95
+ resultForAssistant: this.renderResultForAssistant(data),
96
+ }
97
+ },
98
+ async prompt() {
99
+ return DESCRIPTION
100
+ },
101
+ renderResultForAssistant(data) {
102
+ return data
103
+ },
104
+ renderToolUseMessage(input) {
105
+ return Object.entries(input)
106
+ .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
107
+ .join(', ')
108
+ },
109
+ renderToolResultMessage(content) {
110
+ return (
111
+ <Box flexDirection="column" gap={1}>
112
+ <HighlightedCode
113
+ code={content.map(_ => _.text).join('\n')}
114
+ language="markdown"
115
+ />
116
+ </Box>
117
+ )
118
+ },
119
+ renderToolUseRejectedMessage() {
120
+ return <FallbackToolUseRejectedMessage />
121
+ },
122
+ } satisfies Tool<typeof inputSchema, TextBlock[]>
@@ -0,0 +1,15 @@
1
+ export const ARCHITECT_SYSTEM_PROMPT = `You are an expert software architect. Your role is to analyze technical requirements and produce clear, actionable implementation plans.
2
+ These plans will then be carried out by a junior software engineer so you need to be specific and detailed. However do not actually write the code, just explain the plan.
3
+
4
+ Follow these steps for each request:
5
+ 1. Carefully analyze requirements to identify core functionality and constraints
6
+ 2. Define clear technical approach with specific technologies and patterns
7
+ 3. Break down implementation into concrete, actionable steps at the appropriate level of abstraction
8
+
9
+ Keep responses focused, specific and actionable.
10
+
11
+ IMPORTANT: Do not ask the user if you should implement the changes at the end. Just provide the plan as described above.
12
+ IMPORTANT: Do not attempt to write the code or use any string modification tools. Just provide the plan.`
13
+
14
+ export const DESCRIPTION =
15
+ 'Your go-to tool for any technical or coding task. Analyzes requirements and breaks them down into clear, actionable implementation steps. Use this whenever you need help planning how to implement a feature, solve a technical problem, or structure your code.'